package com.shujia;

import com.shujia.utils.MysqlTool;

import java.io.BufferedReader;
import java.io.FileReader;
import java.sql.*;
import java.util.Properties;
import java.util.Scanner;
import java.util.UUID;

public class JDBCDemo5 {
    private static Connection conn;
    private static Statement state;
    private static Scanner sc;
    public static void main(String[] args) {

        try {
            //使用工具类获取连接对象
            conn = MysqlTool.getConnection();

            //3、获取数据库操作对象
            state = conn.createStatement();

            //创建键盘录入对象
            sc = new Scanner(System.in);

            init();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (state != null) {
                try {
                    state.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void init() throws Exception{
        System.out.println("========================= ** 欢迎来到雷鹏程婚恋介绍所 ** ===============================");
        login();

    }

    public static void login() throws Exception{
        System.out.println("请输入您的用户名: ");
        String username = sc.nextLine();
        //拿着用户名去数据库查询是否存在该用户
        String selectUserAsNameSql = "select * from users where name='"+username+"'";
        ResultSet resultSet = state.executeQuery(selectUserAsNameSql);
        int number = 3;
        if(resultSet.next()){
            while (number>0){
                System.out.println("请输入您的密码:");
                String password = sc.nextLine();
                //查询数据库用户名和密码是否正确
                /**
                 * sql注入的问题：我们在不知道用户密码的前提下，利用了sql语法的or来登录
                 *
                 * 因为我们是先做了sql的拼接，然后再编译执行sql语句，会将sql中特殊关键词解析成sql语法去执行
                 * 实际上应该将输入的信息作为一个整体，而不应该将其编译成特殊的语法
                 * sad' or '1'='1 这个整体应该就单纯当作一个密码，不应该再去解析里面的符号
                 *
                 * 解决方案：我们应该先编译解析，然后再传值。
                 * 换一个数据库操作对象
                 * conn.prepareStatement 获取预编译数据库操作对象，主要是针对查询
                 */
                // ? 相当于占位符
                PreparedStatement prep = conn.prepareStatement("select * from users where name=? and password=?");
//                String selectUserSql = "select * from users where name='"+username+"' and password='"+password+"'";
//                System.out.println(selectUserSql);
//                ResultSet resultSet1 = state.executeQuery(selectUserSql);
                prep.setString(1,username);
                prep.setString(2,password);
                ResultSet resultSet1 = prep.executeQuery();
                if(resultSet1.next()){
                    System.out.println("登录成功！开始寻找爱情~~~");
                    break;
                }else {
                    System.out.println("登录失败，用户名和密码不匹配！！您还有 "+(--number)+" 次机会输入！");
                }
            }
        }else {
            System.out.println("该用户不存在，请先注册！");
            System.out.println("是否要进行注册？（Y/N）");
            String flag = sc.next();
            if("Y".equals(flag)){
                regist();
            }else {
                System.out.println("欢迎下次使用~~");
            }
        }
    }

    public static void regist() throws Exception{
        System.out.println("请输入注册的用户名: ");
        String new_user = sc.next();
        System.out.println("请输入设置的密码: ");
        String password = sc.next();
        //自动生成uid
        String id = UUID.randomUUID().toString();
        String newUserSql = "insert into users values('"+id+"','"+new_user+"','"+password+"')";
        System.out.println(newUserSql);
        int number2 = state.executeUpdate(newUserSql);
        if(number2==1){
            System.out.println("用户注册成功！！");
        }else {
            System.out.println("用户注册失败！！");
        }
    }
}
